package com.douma._12_day_滑动窗口.practice._1176;

/**
 * @官方网站 : https://douma.ke.qq.com
 * @微信公众号 : 抖码课堂
 * @官方微信号 : bigdatatang01
 * 抖码算法，让算法学习变的简单有趣
 * @作者 : 老汤
 */
public class _1176_diet_plan_performance {
    /*  leetcode 1176. 健身计划评估
        你的好友是一位健身爱好者。前段日子，他给自己制定了一份健身计划。现在想请你帮他评估一下这份计划是否合理。

        他会有一份计划消耗的卡路里表，其中 calories[i] 给出了你的这位好友在第 i 天需要消耗的卡路里总量。

        为了更好地评估这份计划，对于卡路里表中的每一天，你都需要计算他 「这一天以及之后的连续几天」 （共 k 天）内消耗的总卡路里 T：

            1. 如果 T < lower，那么这份计划相对糟糕，并失去 1 分； 
            2. 如果 T > upper，那么这份计划相对优秀，并获得 1 分；
            3. 否则，这份计划普普通通，分值不做变动。
        请返回统计完所有 calories.length 天后得到的总分作为评估结果。

        注意：总分可能是负数。

        示例 1：
        输入：calories = [1,2,3,4,5], k = 1, lower = 3, upper = 3
        输出：0
        解释：calories[0], calories[1] < lower 而 calories[3], calories[4] > upper, 总分 = 0.

        示例 2：
        输入：calories = [3,2], k = 2, lower = 0, upper = 1
        输出：1
        解释：calories[0] + calories[1] > upper, 总分 = 1.

        示例 3：
        输入：calories = [6,5,0,0], k = 2, lower = 1, upper = 5
        输出：0
        解释：calories[0] + calories[1] > upper, calories[2] + calories[3] < lower, 总分 = 0.
         

        提示：
        1 <= k <= calories.length <= 10^5
        0 <= calories[i] <= 20000
        0 <= lower <= upper

     */

    public int dietPlanPerformance(int[] calories, int k, int lower, int upper) {
        // 维护滑动窗口
        int left = 0, right = 0;
        // 总分
        int totalScore = 0;
        // 当前 window 的总能量
        int windowTotalCalories = 0;
        while (right < calories.length) {
            // 更新当前窗口的总能量
            windowTotalCalories += calories[right];

            // left 的移动时机：窗口大小为 k 的时候
            // left 的移动策略：
            //  1. 判断窗口中的总卡路里并且和 lower 以及 upper 比较，来确定总分
            //  2. 移动 left 的时候，减去 left 指定的卡路里数量
            if (right - left + 1 == k) {
                if (windowTotalCalories < lower) {
                    totalScore--;
                } else if (windowTotalCalories > upper) {
                    totalScore++;
                }
                windowTotalCalories -= calories[left++];
            }

            right++;
        }
        return totalScore;
    }
}
